함수의 return은 오직 한개의 객체만 리턴한다. 
보통 튜플로 리턴을 할 경우 여러개의 변수로 한번에 받게 할 수 있어 마치 return이 여러개의 값을 동시에 리턴하는 것처럼 보이지만
튜플이라는 객체 하나를 리턴하는 것이다.

In [5]:
def swap(a,b):
    return b,a #튜플이 반환된다.

In [6]:
a = 1
b = 2

In [7]:
a,b = swap(a,b)

In [8]:
print(a,b)


2 1

In [9]:
print(swap)


<function swap at 0x104097730>

함수가 생성되면 함수 자체도 객체이다. 그리고 그객체의 주소를 swap라는 변수가 참조한다.


In [10]:
def intersect(prelist, postlist):
    ret_list = []
    for x in prelist:
        if x in postlist and x not in ret_list:
            ret_list.append(x)
    return ret_list

In [11]:
list1 = "HELLO"
list2 = "CLS"

In [12]:
print(intersect(list1, list2))


['L']

In [13]:
a = 10 # Namespace:global 이다.
b = 20 # Namespace:global 이다.

In [14]:
def sum(x,y):
    return x+y

In [15]:
print(sum(a,b)) #x,y 가 글로벌 네임스테이스의 a,b의 주소를 참조하게 된다.


30

In [16]:
def sum2(x,y):
    x = 1            # 1이라는 객체를 생성하고 그 주소를 변수 x가 새롭게 참조 한다. 변수 x의 네임스페이스는 sum2이다. 
    return x+y

In [17]:
x = 10  # 10은 이뮤터블이다. 즉 10 객체는 오퍼레이션이 없다. 10자체를 변경시키는 오퍼레이션이 없다.

In [18]:
print(sum2(x,b))  #x,y가 x=10 과 b를 참조한다. 그러나 sum2네임스페이스안에서 x는 새로운 객체 1을 참조 하는 것으로 변경 된다.


21

In [19]:
print(x)


10

In [36]:
def change(x):
    print(x[0])
    print(type(x[0]))
    print(id(x))
    print(id(x[0]))
    print(id(x[1]))
    print(id(x[2]))
    x[0] = 'H'

In [37]:
w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다.

In [38]:
change(w_list)
print(w_list)


S
<class 'str'>
4363328328
4323042896
4323428144
4323428256
['H', 'A', 'M']

In [39]:
def change2(x):
    x = x[:]   # clone를 해서 변경을 한다. 그러면 외부의 list는 그대로 있게 된다. 
    x[0] = "H"

In [41]:
w_list = ["S","A","M"]

print(w_list)
change2(w_list)
print(w_list)


['S', 'A', 'M']
['S', 'A', 'M']
nameSpace 는 프로그램에서 쓰이는 이름이 저장되는 공간이다. 

여기서 이름이란 객체 참조 변수를 말하는 것이다. 
함수 안에는 별도의 이름공간이 생성이 된다. 그 이름 공간을 Local scope, 함수 밖은 global scope 이라고 하고 
파이썬에서 정의한 내용에 대한 영역을 내장 영역(built-in-scope)라고 한다. 

함수 안에서 어떤 네임을 사용할 경우 그 함수 스코프 내에 이름이 없는경우 상의 스코프를 뒤진다. 

찾는 순서는  Local -> global -> built-in 순으로 검색 한다. 

이걸 스코핑 룰 이라 한다. 

In [45]:
a = [1,2,3]

def scoping():
    a = [4,5,6]
    print(a)

In [46]:
scoping()
print(a)


[4, 5, 6]
[1, 2, 3]

In [61]:
x = 1

def func(a):
    return a + x  #x를 찾지만 local scope내의 이름공간에 x가 정의 되지 않았기 때문에 상위 scope에서 찾는다. 단 사용하는것 만가능함 상위 스코프의 변수에 조작은 못함

In [62]:
func(1)


Out[62]:
2

In [63]:
def func2(a):
    x = 2
    return a+x #x를 local scope내의 이름공간서 찾는데 있어서 그걸로 사용한다.

In [64]:
func2(1)


Out[64]:
3

In [71]:
def func3(a):
    try:
        x = x + 1  
    except UnboundLocalError:
        print("에러 발생함")
    else:
        return a + x

In [72]:
func3(1)


에러 발생함
global이 하는 일은 새로운 지역 변수를 만들거나 복사하는 것이 아니라 
단지 전역 영역의 값을 지역 영역에 참조할 수 있게 전역변수의 레퍼런스를 지역변수 영역 이름공간에 생성하는 것이다. 

In [73]:
g = 1
def testScope(a):
    global g  #전역 스코프에 존재하는 변수의 값을 변경 할 수 있게 한다. 
    g = 2 #java는 이렇게 하면 전역에 있는 값이 수정되지만 파이썬은 타입개념이 없어 이렇게만 하면 그냥 지역변수 선언이다 그래서 전역에 영향을 미치도록 하기 위해서 global을 사용한다.
    return g + a

In [74]:
testScope(1)


Out[74]:
3

In [75]:
g


Out[75]:
2

In [76]:
print(dir())


['In', 'Out', '_', '_50', '_52', '_54', '_56', '_58', '_62', '_64', '_74', '_75', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i10', '_i11', '_i12', '_i13', '_i14', '_i15', '_i16', '_i17', '_i18', '_i19', '_i2', '_i20', '_i21', '_i22', '_i23', '_i24', '_i25', '_i26', '_i27', '_i28', '_i29', '_i3', '_i30', '_i31', '_i32', '_i33', '_i34', '_i35', '_i36', '_i37', '_i38', '_i39', '_i4', '_i40', '_i41', '_i42', '_i43', '_i44', '_i45', '_i46', '_i47', '_i48', '_i49', '_i5', '_i50', '_i51', '_i52', '_i53', '_i54', '_i55', '_i56', '_i57', '_i58', '_i59', '_i6', '_i60', '_i61', '_i62', '_i63', '_i64', '_i65', '_i66', '_i67', '_i68', '_i69', '_i7', '_i70', '_i71', '_i72', '_i73', '_i74', '_i75', '_i76', '_i8', '_i9', '_ih', '_ii', '_iii', '_oh', '_sh', 'a', 'b', 'change', 'change2', 'exit', 'func', 'func2', 'func3', 'g', 'get_ipython', 'intersect', 'list1', 'list2', 'quit', 'scoping', 'str', 'sum', 'sum2', 'swap', 'testScope', 'w_list', 'x']

In [79]:
print(dir(func2))


['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

In [80]:
dir(__name__)


Out[80]:
['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__getnewargs__',
 '__gt__',
 '__hash__',
 '__init__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rmod__',
 '__rmul__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'capitalize',
 'casefold',
 'center',
 'count',
 'encode',
 'endswith',
 'expandtabs',
 'find',
 'format',
 'format_map',
 'index',
 'isalnum',
 'isalpha',
 'isdecimal',
 'isdigit',
 'isidentifier',
 'islower',
 'isnumeric',
 'isprintable',
 'isspace',
 'istitle',
 'isupper',
 'join',
 'ljust',
 'lower',
 'lstrip',
 'maketrans',
 'partition',
 'replace',
 'rfind',
 'rindex',
 'rjust',
 'rpartition',
 'rsplit',
 'rstrip',
 'split',
 'splitlines',
 'startswith',
 'strip',
 'swapcase',
 'title',
 'translate',
 'upper',
 'zfill']

In [83]:
print(globals())


{'_i47': 'print(global)', '_i36': "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    print(id(x))\n    print(id(x[0]))\n    print(id(x[1]))\n    print(id(x[2]))\n    x[0] = 'H'", '_58': 3, '__builtins__': <module 'builtins' (built-in)>, '_i42': 'a = [1,2,3]\n\ndef scoping():\n    a = [4,5,6]', '_i79': 'print(dir(func2))', '_82': {...}, '__spec__': None, '_56': 3, '_i74': 'testScope(1)', '_i54': 'func(1)', 'Out': {64: 3, 82: {...}, 74: 3, 75: 2, 77: ['In', 'Out', '_', '_50', '_52', '_54', '_56', '_58', '_62', '_64', '_74', '_75', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i10', '_i11', '_i12', '_i13', '_i14', '_i15', '_i16', '_i17', '_i18', '_i19', '_i2', '_i20', '_i21', '_i22', '_i23', '_i24', '_i25', '_i26', '_i27', '_i28', '_i29', '_i3', '_i30', '_i31', '_i32', '_i33', '_i34', '_i35', '_i36', '_i37', '_i38', '_i39', '_i4', '_i40', '_i41', '_i42', '_i43', '_i44', '_i45', '_i46', '_i47', '_i48', '_i49', '_i5', '_i50', '_i51', '_i52', '_i53', '_i54', '_i55', '_i56', '_i57', '_i58', '_i59', '_i6', '_i60', '_i61', '_i62', '_i63', '_i64', '_i65', '_i66', '_i67', '_i68', '_i69', '_i7', '_i70', '_i71', '_i72', '_i73', '_i74', '_i75', '_i76', '_i77', '_i8', '_i9', '_ih', '_ii', '_iii', '_oh', '_sh', 'a', 'b', 'change', 'change2', 'exit', 'func', 'func2', 'func3', 'g', 'get_ipython', 'intersect', 'list1', 'list2', 'quit', 'scoping', 'str', 'sum', 'sum2', 'swap', 'testScope', 'w_list', 'x'], 80: ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'], 50: 2, 52: 2, 54: 3, 56: 3, 58: 3, 62: 2}, '_i33': "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    print(id(x))\n    print(id(x[0]))\n    print(id(x[1]))\n    x[0] = 'H'", '___': ['In', 'Out', '_', '_50', '_52', '_54', '_56', '_58', '_62', '_64', '_74', '_75', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i10', '_i11', '_i12', '_i13', '_i14', '_i15', '_i16', '_i17', '_i18', '_i19', '_i2', '_i20', '_i21', '_i22', '_i23', '_i24', '_i25', '_i26', '_i27', '_i28', '_i29', '_i3', '_i30', '_i31', '_i32', '_i33', '_i34', '_i35', '_i36', '_i37', '_i38', '_i39', '_i4', '_i40', '_i41', '_i42', '_i43', '_i44', '_i45', '_i46', '_i47', '_i48', '_i49', '_i5', '_i50', '_i51', '_i52', '_i53', '_i54', '_i55', '_i56', '_i57', '_i58', '_i59', '_i6', '_i60', '_i61', '_i62', '_i63', '_i64', '_i65', '_i66', '_i67', '_i68', '_i69', '_i7', '_i70', '_i71', '_i72', '_i73', '_i74', '_i75', '_i76', '_i77', '_i8', '_i9', '_ih', '_ii', '_iii', '_oh', '_sh', 'a', 'b', 'change', 'change2', 'exit', 'func', 'func2', 'func3', 'g', 'get_ipython', 'intersect', 'list1', 'list2', 'quit', 'scoping', 'str', 'sum', 'sum2', 'swap', 'testScope', 'w_list', 'x'], '_oh': {64: 3, 82: {...}, 74: 3, 75: 2, 77: ['In', 'Out', '_', '_50', '_52', '_54', '_56', '_58', '_62', '_64', '_74', '_75', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i10', '_i11', '_i12', '_i13', '_i14', '_i15', '_i16', '_i17', '_i18', '_i19', '_i2', '_i20', '_i21', '_i22', '_i23', '_i24', '_i25', '_i26', '_i27', '_i28', '_i29', '_i3', '_i30', '_i31', '_i32', '_i33', '_i34', '_i35', '_i36', '_i37', '_i38', '_i39', '_i4', '_i40', '_i41', '_i42', '_i43', '_i44', '_i45', '_i46', '_i47', '_i48', '_i49', '_i5', '_i50', '_i51', '_i52', '_i53', '_i54', '_i55', '_i56', '_i57', '_i58', '_i59', '_i6', '_i60', '_i61', '_i62', '_i63', '_i64', '_i65', '_i66', '_i67', '_i68', '_i69', '_i7', '_i70', '_i71', '_i72', '_i73', '_i74', '_i75', '_i76', '_i77', '_i8', '_i9', '_ih', '_ii', '_iii', '_oh', '_sh', 'a', 'b', 'change', 'change2', 'exit', 'func', 'func2', 'func3', 'g', 'get_ipython', 'intersect', 'list1', 'list2', 'quit', 'scoping', 'str', 'sum', 'sum2', 'swap', 'testScope', 'w_list', 'x'], 80: ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'], 50: 2, 52: 2, 54: 3, 56: 3, 58: 3, 62: 2}, '_i34': 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', '_i77': 'dir()', 'In': ['', 'def swap(a,b):\n    return b,a', 'a = 1\nb = 2', 'a,b = swap(a,b)', 'print(a,b)', 'def swap(a,b):\n    return b,a #튜플이 반환된다. ', 'a = 1\nb = 2', 'a,b = swap(a,b)', 'print(a,b)', 'print(swap)', 'def intersect(prelist, postlist):\n    ret_list = []\n    for x in prelist:\n        if x in postlist and x not in ret_list:\n            ret_list.append(x)\n    return ret_list', 'list1 = "HELLO"\nlist2 = "CLS"', 'print(intersect(list1, list2))', 'a = 10\nb = 20', 'def sum(x,y):\n    return x+y', 'print(sum(a,b))', 'def sum2(x,y):\n    x = 1\n    return x+y', 'x = 10', 'print(sum2(x,b))', 'print(x)', "def change(x):\n    x[0] = 'H'", 'str = "ABC"', 'print(change(str))', 'w_list = ["S", "A", "M"]', 'print(change(str))', 'print(change(w_list))', 'change(w_list)\nprint(w_list)', "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    x[0] = 'H'", 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', 'change(w_list)\nprint(w_list)', "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    print(id(x))\n    print(id(x[0]))\n    x[0] = 'H'", 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', 'change(w_list)\nprint(w_list)', "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    print(id(x))\n    print(id(x[0]))\n    print(id(x[1]))\n    x[0] = 'H'", 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', 'change(w_list)\nprint(w_list)', "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    print(id(x))\n    print(id(x[0]))\n    print(id(x[1]))\n    print(id(x[2]))\n    x[0] = 'H'", 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', 'change(w_list)\nprint(w_list)', 'def change2(x):\n    x = x[:]\n    x[0] = "H"', 'print(w_list)\nchange2(w_list)\nprint(w_list)', '\nw_list = ["S","A","M"]\n\nprint(w_list)\nchange2(w_list)\nprint(w_list)', 'a = [1,2,3]\n\ndef scoping():\n    a = [4,5,6]', 'print(a)', 'a = [1,2,3]\n\ndef scoping():\n    a = [4,5,6]\n    print(a)', 'a = [1,2,3]\n\ndef scoping():\n    a = [4,5,6]\n    print(a)', 'scoping()\nprint(a)', 'print(global)', 'print(__global__)', 'x = 1\n\ndef func(a):\n    return a + x', 'func(1)', 'x = 1\n\ndef func(a):\n    return a + x  #x를 찾지만 local scope내의 이름공간에 x가 정의 되지 않았기 때문에 상위 scope에서 찾는다. ', 'func(1)', 'def func(a):\n    x = 2\n    return a+x', 'func(1)', 'def func(a):\n    x = 2\n    return a+x #x를 local scope내의 이름공간서 찾는데 있어서 그걸로 사용한다. ', 'func(1)', 'def func2(a):\n    x = 2\n    return a+x #x를 local scope내의 이름공간서 찾는데 있어서 그걸로 사용한다. 단 사용하는것 만가능함 상위 스코프의 변수에 조작은 못함', 'func2(1)', 'def func3(a):\n    x = x + 1\n    return a + x', 'func3(1)', 'x = 1\n\ndef func(a):\n    return a + x  #x를 찾지만 local scope내의 이름공간에 x가 정의 되지 않았기 때문에 상위 scope에서 찾는다. 단 사용하는것 만가능함 상위 스코프의 변수에 조작은 못함', 'func(1)', 'def func2(a):\n    x = 2\n    return a+x #x를 local scope내의 이름공간서 찾는데 있어서 그걸로 사용한다. ', 'func2(1)', 'def func3(a):\n    x = x + 1\n    return a + x', 'func3(1)', 'def func3(a):\n    try:\n        x = x + 1  \n    except UnboundLocalError:\n        print("에러 발생함")\n    return a + x', 'func3(1)', 'def func3(a):\n    try:\n        x = x + 1  \n        return a + x\n    except UnboundLocalError:\n        print("에러 발생함")\n    ', 'func3(1)', 'def func3(a):\n    try:\n        x = x + 1  \n    except UnboundLocalError:\n        print("에러 발생함")\n    else:\n        return a + x', 'func3(1)', 'g = 1\ndef testScope(a):\n    global g\n    g = 2\n    return g + a', 'testScope(1)', 'g', 'print(dir())', 'dir()', 'print(dir(func))', 'print(dir(func2))', 'dir(__name__)', 'dir(__main__)', 'globals()', 'print(globals())'], '_64': 3, 'sum2': <function sum2 at 0x104126268>, '_i21': 'str = "ABC"', '_i76': 'print(dir())', '_i61': 'x = 1\n\ndef func(a):\n    return a + x  #x를 찾지만 local scope내의 이름공간에 x가 정의 되지 않았기 때문에 상위 scope에서 찾는다. 단 사용하는것 만가능함 상위 스코프의 변수에 조작은 못함', '_i1': 'def swap(a,b):\n    return b,a', '_i78': 'print(dir(func))', '_77': ['In', 'Out', '_', '_50', '_52', '_54', '_56', '_58', '_62', '_64', '_74', '_75', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i10', '_i11', '_i12', '_i13', '_i14', '_i15', '_i16', '_i17', '_i18', '_i19', '_i2', '_i20', '_i21', '_i22', '_i23', '_i24', '_i25', '_i26', '_i27', '_i28', '_i29', '_i3', '_i30', '_i31', '_i32', '_i33', '_i34', '_i35', '_i36', '_i37', '_i38', '_i39', '_i4', '_i40', '_i41', '_i42', '_i43', '_i44', '_i45', '_i46', '_i47', '_i48', '_i49', '_i5', '_i50', '_i51', '_i52', '_i53', '_i54', '_i55', '_i56', '_i57', '_i58', '_i59', '_i6', '_i60', '_i61', '_i62', '_i63', '_i64', '_i65', '_i66', '_i67', '_i68', '_i69', '_i7', '_i70', '_i71', '_i72', '_i73', '_i74', '_i75', '_i76', '_i77', '_i8', '_i9', '_ih', '_ii', '_iii', '_oh', '_sh', 'a', 'b', 'change', 'change2', 'exit', 'func', 'func2', 'func3', 'g', 'get_ipython', 'intersect', 'list1', 'list2', 'quit', 'scoping', 'str', 'sum', 'sum2', 'swap', 'testScope', 'w_list', 'x'], '_i63': 'def func2(a):\n    x = 2\n    return a+x #x를 local scope내의 이름공간서 찾는데 있어서 그걸로 사용한다. ', '_i15': 'print(sum(a,b))', 'x': 1, '_i71': 'def func3(a):\n    try:\n        x = x + 1  \n    except UnboundLocalError:\n        print("에러 발생함")\n    else:\n        return a + x', 'func3': <function func3 at 0x10414ef28>, '_i26': 'change(w_list)\nprint(w_list)', '_i80': 'dir(__name__)', '_i38': 'change(w_list)\nprint(w_list)', '_i2': 'a = 1\nb = 2', '_i43': 'print(a)', 'list2': 'CLS', '_i6': 'a = 1\nb = 2', 'quit': <IPython.core.autocall.ZMQExitAutocall object at 0x103f734a8>, '_74': 3, '__': ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'], '_i39': 'def change2(x):\n    x = x[:]\n    x[0] = "H"', '_i18': 'print(sum2(x,b))', '_i35': 'change(w_list)\nprint(w_list)', '_i14': 'def sum(x,y):\n    return x+y', '_i70': 'func3(1)', '_i30': "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    print(id(x))\n    print(id(x[0]))\n    x[0] = 'H'", '__builtin__': <module 'builtins' (built-in)>, '_i83': 'print(globals())', '_i5': 'def swap(a,b):\n    return b,a #튜플이 반환된다. ', '_ih': ['', 'def swap(a,b):\n    return b,a', 'a = 1\nb = 2', 'a,b = swap(a,b)', 'print(a,b)', 'def swap(a,b):\n    return b,a #튜플이 반환된다. ', 'a = 1\nb = 2', 'a,b = swap(a,b)', 'print(a,b)', 'print(swap)', 'def intersect(prelist, postlist):\n    ret_list = []\n    for x in prelist:\n        if x in postlist and x not in ret_list:\n            ret_list.append(x)\n    return ret_list', 'list1 = "HELLO"\nlist2 = "CLS"', 'print(intersect(list1, list2))', 'a = 10\nb = 20', 'def sum(x,y):\n    return x+y', 'print(sum(a,b))', 'def sum2(x,y):\n    x = 1\n    return x+y', 'x = 10', 'print(sum2(x,b))', 'print(x)', "def change(x):\n    x[0] = 'H'", 'str = "ABC"', 'print(change(str))', 'w_list = ["S", "A", "M"]', 'print(change(str))', 'print(change(w_list))', 'change(w_list)\nprint(w_list)', "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    x[0] = 'H'", 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', 'change(w_list)\nprint(w_list)', "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    print(id(x))\n    print(id(x[0]))\n    x[0] = 'H'", 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', 'change(w_list)\nprint(w_list)', "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    print(id(x))\n    print(id(x[0]))\n    print(id(x[1]))\n    x[0] = 'H'", 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', 'change(w_list)\nprint(w_list)', "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    print(id(x))\n    print(id(x[0]))\n    print(id(x[1]))\n    print(id(x[2]))\n    x[0] = 'H'", 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', 'change(w_list)\nprint(w_list)', 'def change2(x):\n    x = x[:]\n    x[0] = "H"', 'print(w_list)\nchange2(w_list)\nprint(w_list)', '\nw_list = ["S","A","M"]\n\nprint(w_list)\nchange2(w_list)\nprint(w_list)', 'a = [1,2,3]\n\ndef scoping():\n    a = [4,5,6]', 'print(a)', 'a = [1,2,3]\n\ndef scoping():\n    a = [4,5,6]\n    print(a)', 'a = [1,2,3]\n\ndef scoping():\n    a = [4,5,6]\n    print(a)', 'scoping()\nprint(a)', 'print(global)', 'print(__global__)', 'x = 1\n\ndef func(a):\n    return a + x', 'func(1)', 'x = 1\n\ndef func(a):\n    return a + x  #x를 찾지만 local scope내의 이름공간에 x가 정의 되지 않았기 때문에 상위 scope에서 찾는다. ', 'func(1)', 'def func(a):\n    x = 2\n    return a+x', 'func(1)', 'def func(a):\n    x = 2\n    return a+x #x를 local scope내의 이름공간서 찾는데 있어서 그걸로 사용한다. ', 'func(1)', 'def func2(a):\n    x = 2\n    return a+x #x를 local scope내의 이름공간서 찾는데 있어서 그걸로 사용한다. 단 사용하는것 만가능함 상위 스코프의 변수에 조작은 못함', 'func2(1)', 'def func3(a):\n    x = x + 1\n    return a + x', 'func3(1)', 'x = 1\n\ndef func(a):\n    return a + x  #x를 찾지만 local scope내의 이름공간에 x가 정의 되지 않았기 때문에 상위 scope에서 찾는다. 단 사용하는것 만가능함 상위 스코프의 변수에 조작은 못함', 'func(1)', 'def func2(a):\n    x = 2\n    return a+x #x를 local scope내의 이름공간서 찾는데 있어서 그걸로 사용한다. ', 'func2(1)', 'def func3(a):\n    x = x + 1\n    return a + x', 'func3(1)', 'def func3(a):\n    try:\n        x = x + 1  \n    except UnboundLocalError:\n        print("에러 발생함")\n    return a + x', 'func3(1)', 'def func3(a):\n    try:\n        x = x + 1  \n        return a + x\n    except UnboundLocalError:\n        print("에러 발생함")\n    ', 'func3(1)', 'def func3(a):\n    try:\n        x = x + 1  \n    except UnboundLocalError:\n        print("에러 발생함")\n    else:\n        return a + x', 'func3(1)', 'g = 1\ndef testScope(a):\n    global g\n    g = 2\n    return g + a', 'testScope(1)', 'g', 'print(dir())', 'dir()', 'print(dir(func))', 'print(dir(func2))', 'dir(__name__)', 'dir(__main__)', 'globals()', 'print(globals())'], 'w_list': ['S', 'A', 'M'], '_i24': 'print(change(str))', '_75': 2, 'change2': <function change2 at 0x104140ea0>, '_i57': 'def func2(a):\n    x = 2\n    return a+x #x를 local scope내의 이름공간서 찾는데 있어서 그걸로 사용한다. 단 사용하는것 만가능함 상위 스코프의 변수에 조작은 못함', 'get_ipython': <bound method InteractiveShell.get_ipython of <ipykernel.zmqshell.ZMQInteractiveShell object at 0x103ebc080>>, '_i22': 'print(change(str))', '_i12': 'print(intersect(list1, list2))', '__package__': None, '__loader__': None, 'exit': <IPython.core.autocall.ZMQExitAutocall object at 0x103f734a8>, '_54': 3, '_i40': 'print(w_list)\nchange2(w_list)\nprint(w_list)', '_i53': 'def func(a):\n    x = 2\n    return a+x', '_50': 2, 'a': [1, 2, 3], '_i72': 'func3(1)', '_i58': 'func2(1)', '_i48': 'print(__global__)', '_i17': 'x = 10', '_i52': 'func(1)', '_i41': '\nw_list = ["S","A","M"]\n\nprint(w_list)\nchange2(w_list)\nprint(w_list)', '_i29': 'change(w_list)\nprint(w_list)', 'list1': 'HELLO', '_i37': 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', '_i60': 'func3(1)', '_52': 2, '_i4': 'print(a,b)', '_i50': 'func(1)', '_i75': 'g', '_i73': 'g = 1\ndef testScope(a):\n    global g\n    g = 2\n    return g + a', '_i28': 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', '_i7': 'a,b = swap(a,b)', '_i66': 'func3(1)', '_i82': 'globals()', '_i44': 'a = [1,2,3]\n\ndef scoping():\n    a = [4,5,6]\n    print(a)', '_i67': 'def func3(a):\n    try:\n        x = x + 1  \n    except UnboundLocalError:\n        print("에러 발생함")\n    return a + x', '_i20': "def change(x):\n    x[0] = 'H'", '_i49': 'x = 1\n\ndef func(a):\n    return a + x', '_i55': 'def func(a):\n    x = 2\n    return a+x #x를 local scope내의 이름공간서 찾는데 있어서 그걸로 사용한다. ', 'g': 2, '_i31': 'w_list = ["S", "A", "M"]  # 리스트는 뮤터블한 객체이다 함수 안에서 내용을 변경 할 수 있다. 뮤터블이기 때문에 그렇다. ', '_i62': 'func(1)', '__doc__': 'Automatically created module for IPython interactive environment', '_dh': ['/Users/jaegyuhan/PythonEx_1'], '_iii': 'dir(__name__)', 'change': <function change at 0x104140840>, '_i81': 'dir(__main__)', '_i27': "def change(x):\n    print(x[0])\n    print(type(x[0]))\n    x[0] = 'H'", '_i13': 'a = 10\nb = 20', 'str': 'ABC', '_i16': 'def sum2(x,y):\n    x = 1\n    return x+y', '_i69': 'def func3(a):\n    try:\n        x = x + 1  \n        return a + x\n    except UnboundLocalError:\n        print("에러 발생함")\n    ', 'intersect': <function intersect at 0x104097d90>, '_i23': 'w_list = ["S", "A", "M"]', '_sh': <module 'IPython.core.shadowns' from '/Users/jaegyuhan/anaconda3/lib/python3.5/site-packages/IPython/core/shadowns.py'>, '_i8': 'print(a,b)', '_i68': 'func3(1)', '_i56': 'func(1)', 'func': <function func at 0x1041266a8>, '_i25': 'print(change(w_list))', '_i3': 'a,b = swap(a,b)', '_i10': 'def intersect(prelist, postlist):\n    ret_list = []\n    for x in prelist:\n        if x in postlist and x not in ret_list:\n            ret_list.append(x)\n    return ret_list', 'scoping': <function scoping at 0x10414e730>, 'sum': <function sum at 0x1041260d0>, '_i11': 'list1 = "HELLO"\nlist2 = "CLS"', '_i64': 'func2(1)', '_62': 2, 'testScope': <function testScope at 0x10414e6a8>, '_i51': 'x = 1\n\ndef func(a):\n    return a + x  #x를 찾지만 local scope내의 이름공간에 x가 정의 되지 않았기 때문에 상위 scope에서 찾는다. ', '_i': 'globals()', '_i65': 'def func3(a):\n    x = x + 1\n    return a + x', '_i19': 'print(x)', '_ii': 'dir(__main__)', '__name__': '__main__', 'b': 20, '_': {...}, 'func2': <function func2 at 0x104140d90>, '_i32': 'change(w_list)\nprint(w_list)', '_i9': 'print(swap)', '_80': ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'], '_i46': 'scoping()\nprint(a)', '_i45': 'a = [1,2,3]\n\ndef scoping():\n    a = [4,5,6]\n    print(a)', 'swap': <function swap at 0x104097730>, '_i59': 'def func3(a):\n    x = x + 1\n    return a + x'}

In [84]:
def argTest(a,b,c):
    print(a,b,c)

In [85]:
argTest(a=1,b=2,3)  #키워드인자 들이 일반 인자보다 나중에 써야 한다.


  File "<ipython-input-85-3c692351c3a5>", line 1
    argTest(a=1,b=2,3)
                   ^
SyntaxError: positional argument follows keyword argument

In [86]:
argTest(1,a=1,b=2)  #이렇게 하면 일반인자 뒤에 키워드 인자들을 사용했으니 될거 같은데 안된다.


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-86-d679d05d91f5> in <module>()
----> 1 argTest(1,a=1,b=2)

TypeError: argTest() got multiple values for argument 'a'

In [87]:
argTest(1,b=2,c=3) #일반인자의 순서는 시그니처 순으로 무조건 와야 한다.


1 2 3

In [90]:
argTest(a=1,2,c=3)  #이렇게 하더라도 두번째 인자인 2 앞에 키워드인자 a=1이 사용이되어서 안된다.


  File "<ipython-input-90-f1cf1da34c61>", line 1
    argTest(a=1,2,c=3)  #이렇게 하더라도 두번째 인자인 2 앞에 키워드인자 a=1이 사용이되어서 안된다.
               ^
SyntaxError: positional argument follows keyword argument

In [93]:
def test(*args):
    print(type(args))
    print(args)

In [94]:
test(1,2,3,4,5)


<class 'tuple'>
(1, 2, 3, 4, 5)

In [95]:
def union(*args):
    res = []
    for i in args:
        for x in i:
            if x not in res:
                res.append(x)
    return res

In [97]:
union("ham","mma", "spam")


Out[97]:
['h', 'a', 'm', 's', 'p']

In [5]:
def urlBuilder(server, **args):
    print(server)
    for i in args.keys():
        print(i, " : ",args[i])

In [8]:
urlBuilder("gg",a = "val_a", b = "val_b", c = "val_c")


gg
a  :  val_a
c  :  val_c
b  :  val_b

In [12]:
(lambda x : x+1)(1)


Out[12]:
2

In [13]:
b = lambda x: x+1

In [14]:
b(3)


Out[14]:
4
아래와 같이 람다를 여러줄에 걸쳐 표현 할 수 있지만 안티 패턴이다. 

In [20]:
def testLambda(g):
    g(1,2,3)

In [21]:
testLambda(lambda a,b,c: print("sum id ", \
                              a+b+c, ": type id a ", type(a) ,\
                              ":list object is ", zip([a,b,c])))


sum id  6 : type id a  <class 'int'> :list object is  <zip object at 0x1040ef4c8>

In [22]:
def fibo(n):
    if n<2: return 1
    return fibo(n-1) + fibo(n-2)

In [23]:
fibo(3)


Out[23]:
3

In [24]:
fibo(4)


Out[24]:
5

In [27]:
for i in range(0,10):
    print(fibo(i))


1
1
2
3
5
8
13
21
34
55

In [39]:
temp = {}

In [40]:
def newFibo(n):
    if n in temp.keys():
        return temp[n]
    
    if n<2: 
        temp[n] = 1
        return 1
    
    temp[n] = newFibo(n-1) + newFibo(n-2)
    return temp[n]

In [41]:
newFibo(1)


Out[41]:
1

In [42]:
newFibo(2)


Out[42]:
2

In [43]:
newFibo(3)


Out[43]:
3

In [44]:
newFibo(4)


Out[44]:
5

In [55]:
temp = {}
for i in range(10):
    print(newFibo(i))


1
1
2
3
5
8
13
21
34
55

In [56]:
print(temp)


{0: 1, 1: 1, 2: 2, 3: 3, 4: 5, 5: 8, 6: 13, 7: 21, 8: 34, 9: 55}

In [2]:
def plus(a,b):
    return a+b

In [3]:
help(plus)


Help on function plus in module __main__:

plus(a, b)


In [5]:
def minus(a,b):
    return a+b

In [6]:
help(minus)


Help on function minus in module __main__:

minus(a, b)


In [7]:
plus.__doc__ = "a,b의 더한 값을 반환 합니다."

In [8]:
help(plus)


Help on function plus in module __main__:

plus(a, b)
    a,b의 더한 값을 반환 합니다.


In [11]:
def fac(n):
    """
     팩토리얼 함수 입니다.
     >>> fac(6)
    """
    if n == 1:
        return n
    return n * fac(n-1)

In [18]:
print(fac(3))


6

In [19]:
help(fac)


Help on function fac in module __main__:

fac(n)
    팩토리얼 함수 입니다.
    >>> fac(6)


In [21]:
for key in {"a":1,"b":2}:
    print(key)


a
b
시퀀스형 자료는 속성으로 이터레이터 객체를 가지고 있다.

In [22]:
s = "abc"

In [24]:
it = iter(s)

In [25]:
print(it)


<str_iterator object at 0x1043ed080>

In [27]:
next(it)


Out[27]:
'a'

In [28]:
next(it)


Out[28]:
'b'

In [29]:
next(it)


Out[29]:
'c'

In [30]:
next(it)


---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-30-2cdb14c0d4d6> in <module>()
----> 1 next(it)

StopIteration: 

In [32]:
it.__next__()


---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-32-a1cc91b7bc73> in <module>()
----> 1 it.__next__()

StopIteration: 

In [33]:
it = iter(s)

In [34]:
it.__next__()


Out[34]:
'a'

In [35]:
it.__next__()


Out[35]:
'b'

In [36]:
it.__next__()


Out[36]:
'c'

In [37]:
it.__next__()


---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-37-a1cc91b7bc73> in <module>()
----> 1 it.__next__()

StopIteration: 

In [40]:
next(iter("ab"))


Out[40]:
'a'

In [ ]: